package com.example.shuiyin.service.impl;

import com.example.shuiyin.config.MinioProperties;
import com.example.shuiyin.exception.AppException;
import com.example.shuiyin.exception.ErrorCode;
import com.example.shuiyin.service.SecureFileAccessService;
import com.example.shuiyin.service.UserService;
import com.example.shuiyin.service.ProcessRecordService;
import io.minio.GetPresignedObjectUrlArgs;
import io.minio.MinioClient;
import io.minio.http.Method;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@RequiredArgsConstructor
@Slf4j
public class SecureFileAccessServiceImpl implements SecureFileAccessService {
    
    private final MinioClient minioClient;
    private final MinioProperties minioProperties;
    private final UserService userService;
    private final ProcessRecordService processRecordService;
    
    /**
     * 获取安全的文件访问URL
     */
    @Override
    public String getSecureFileUrl(String objectName, Long userId, Long expirySeconds) {
        try {
            // 验证权限
            if (!hasAccessPermission(objectName, userId)) {
                throw new AppException("无权访问此文件", ErrorCode.FORBIDDEN);
            }
            
            // 生成预签名URL
            String bucketName = minioProperties.getBucket();
            return minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(objectName)
                    .expiry(expirySeconds.intValue(), TimeUnit.SECONDS)
                    .build());
        } catch (AppException e) {
            throw e;
        } catch (Exception e) {
            log.error("生成安全访问URL失败: {}", e.getMessage(), e);
            throw new AppException("获取预签名URL失败", ErrorCode.INTERNAL_SERVER_ERROR);
        }
    }
    
    /**
     * 检查用户是否有权限访问指定文件
     */
    private boolean hasAccessPermission(String objectName, Long userId) {
        // 基本权限检查：判断路径中是否包含用户ID
        // 例如：watermark/123/file.jpg 中的123应该与userId匹配
        
        // 如果是管理员，可以访问所有文件
        // TODO: 实现实际的权限检查逻辑
        
        return true; // 简化示例，实际应检查路径中的用户ID
    }

    @Override
    public boolean checkFileAccess(String filename, Long userId) {
        if (filename == null || userId == null) {
            return false;
        }
        
        // 直接使用Long类型的userId，不需要转换
        return processRecordService.checkFileAccess(filename, userId);
    }
} 